
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;

public class GameWin extends JFrame {
    public static int state =0; // 游戏状态
    public int score=0; // 分数（原有不变）
    Image offScreenImage=null; // 双缓存图片
    int winWidth=800;
    int winHeight=600;
    HeadObj headObj=new HeadObj(GameUtils.rightImg,60,570,this); // 蛇头
    public List<BodyObj> bodyObjsList=new ArrayList<>(); // 蛇身

    // 替换单个食物为食物列表，适配第四关多食物逻辑
    public List<FoodObj> foodObjList = new ArrayList<>();

    public void launch(){
        this.setVisible(true);
        this.setSize(winWidth,winHeight);
        this.setLocationRelativeTo(null);
        this.setTitle("贪吃蛇小游戏");
        // 初始化蛇身（原有不变）
        bodyObjsList.add(new BodyObj(GameUtils.bodyImg,30,570,this));
        bodyObjsList.add(new BodyObj(GameUtils.bodyImg,0,570,this));

        // 初始化食物：根据关卡生成对应数量食物
        initFoodByLevel();

        // 键盘事件（原有不变）
        this.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if(e.getKeyCode()==KeyEvent.VK_SPACE){
                    switch (state){
                        case 0: state=1; break;
                        case 1: state=2; repaint(); break;
                        case 2: state=1; break;
                        case 3: state=5; break;
                        case 4: state=6; break;
                        default: break;
                    }
                }
            }
        });

        // 游戏循环（原有不变）
        while(true){
            if(state==1){ repaint(); }
            if(state==5){ state=0; resetGame(); }
            // 修改关卡判定：支持到第五关（无尽模式）
            if(state==6&&GameUtils.level!=5){
                state=1;
                GameUtils.level++;
                resetGame();
            }
            try { Thread.sleep(200); } catch (InterruptedException e) { throw new RuntimeException(e); }
        }
    }

    // 新增：根据关卡初始化食物数量
    private void initFoodByLevel() {
        FoodObj foodObj = new FoodObj();
        foodObjList.clear();
        if(GameUtils.level == 4||GameUtils.level==5){
            // 第四关：生成3个食物
            foodObjList = foodObj.getFoodList(GameUtils.LEVEL4_FOOD_COUNT);
        }else{
            // 1-3关：保持1个食物（兼容原有逻辑）
            foodObjList.add(foodObj.getFood());
        }
        // 第五关：开启无尽模式
        if(GameUtils.level ==5){
            GameUtils.isEndlessMode = true;
        }
    }

    @Override
    public void paint(Graphics g) {
        // 双缓存初始化（原有不变）
        if(offScreenImage==null){ offScreenImage=this.createImage(winWidth,winHeight); }
        Graphics gImage=offScreenImage.getGraphics();
        // 绘制背景和网格（原有不变）
        gImage.setColor(Color.gray);
        gImage.fillRect(0,0,winWidth,winHeight);
        gImage.setColor(Color.black);
        for(int i=0;i<=20;i++){
            gImage.drawLine(0,i*30,600,i*30);
            gImage.drawLine(i*30,0,i*30,600);
        }
        // 绘制蛇身（原有不变）
        for(int i=bodyObjsList.size()-1;i>=0;i--){ bodyObjsList.get(i).paintSelf(gImage); }
        // 绘制蛇头（原有不变）
        headObj.paintSelf(gImage);
        // 绘制食物：从单食物改为遍历食物列表
        for(FoodObj food : foodObjList){ food.paintSelf(gImage); }
        // 绘制关卡和分数（原有不变）
        GameUtils.drawWord(gImage,"第"+GameUtils.level+"关",Color.orange,40,650,260);
        GameUtils.drawWord(gImage,score+"分",Color.BLUE,50,650,330);
        // 绘制提示语（原有不变）
        prompt(gImage);
        g.drawImage(offScreenImage,0,0,null);
    }

    // 修改提示语：适配第五关无尽模式
    void prompt(Graphics g) {
        if (state == 0) {
            g.fillRect(120, 240, 400, 70);
            GameUtils.drawWord(g, "按下空格键开始游戏", Color.yellow, 35, 150, 290);
        }
        if (state == 2) {
            g.fillRect(120, 240, 400, 70);
            GameUtils.drawWord(g, "按下空格键继续游戏", Color.yellow, 35, 150, 290);
        }
        if (state == 3) {
            g.fillRect(120, 240, 400, 70);
            GameUtils.drawWord(g, "失败,按空格键重新开始", Color.red, 35, 150, 290);
        }
        if (state == 4) {
            g.fillRect(120, 240, 400, 70);
            if (GameUtils.level == 5) {
                // 第五关无尽模式无通关，提示游戏结束
                GameUtils.drawWord(g, "无尽模式结束，游戏失败", Color.red, 35, 150, 290);
            } else if(GameUtils.level ==3){
                GameUtils.drawWord(g, "达成条件，游戏通关", Color.green, 35, 150, 290);
            }else {
                GameUtils.drawWord(g, "达成条件，空格下一关", Color.green, 35, 150, 290);
            }
        }
    }

    // 重置游戏：新增初始化食物逻辑
    void resetGame(){
        this.dispose();
        String[] args={};
        main(args);
    }

    public static void main(String[] args) {
        GameWin gameWin=new GameWin();
        gameWin.launch();
    }
}